﻿// Copyright 2017 the original author or authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Steeltoe.Messaging;
using System.Collections.Generic;
using System.Threading;

namespace Steeltoe.Integration.Dispatcher
{
    public class RoundRobinLoadBalancingStrategy : ILoadBalancingStrategy
    {
        private int _currentHandlerIndex = -1;

        public int GetNextHandlerStartIndex(IMessage message, List<IMessageHandler> handlers)
        {
            if (handlers == null)
            {
                return 0;
            }

            var size = handlers.Count;
            if (size > 0)
            {
                var indexTail = Interlocked.Increment(ref _currentHandlerIndex) % size;
                return indexTail < 0 ? indexTail + size : indexTail;
            }
            else
            {
                return size;
            }
        }

        internal int CurrentHandlerIndex
        {
            get { return _currentHandlerIndex; }
            set { _currentHandlerIndex = value; }
        }
    }
}
